// Chrome 扩展核心数据类型定义

// 重导出 API types
export type { CollectionWithTabsDto } from '@/api/types';

// 标签页数据结构（与后端 API 对齐）
export interface TabItem {
    id: number;
    collectionId: number;
    url: string;
    title: string;
    domain: string;
    favicon?: string;
    isPinned: boolean;
    position: number;
    createdAt: number;
    updatedAt: number;
}

// 集合基础信息（可被多个空间引用）
export interface Collection {
    id: number;
    name: string;
    createdAt: number;
    updatedAt: number;
}

// 空间内的集合视图（绑定信息 + 标签页）
export interface SpaceCollection {
    spaceId: number;
    collectionId: number;
    position: number;
    collection: Collection;
    tabs: TabItem[];
}

// React组件基础Props类型
export interface BaseComponentProps {
    // 可选的CSS类名
    className?: string;
    // 子组件
    children?: React.ReactNode;
}

// 表单字段错误类型
export interface FormFieldError {
    // 错误信息
    message: string;
    // 错误类型
    type: 'required' | 'pattern' | 'custom';
}

// 表单验证结果类型
export interface FormValidationResult {
    // 是否验证通过
    isValid: boolean;
    // 错误信息映射，键为字段名
    errors: Record<string, FormFieldError>;
}

// 卡片操作按钮类型
export type CardAction = 'edit' | 'copy' | 'delete';

// 模态框状态类型
export type ModalState = 'closed' | 'opening' | 'open' | 'closing';

// 工具提示位置类型
export type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';

// Toast通知类型
export interface ToastMessage {
    // 消息ID
    id: string;
    // 消息内容
    message: string;
    // 消息类型
    type: 'success' | 'error' | 'info' | 'warning';
    // 持续时间（毫秒）
    duration?: number;
}

// 搜索过滤状态类型
export interface SearchFilter {
    // 搜索关键词
    query: string;
    // 是否区分大小写
    caseSensitive: boolean;
    // 搜索范围
    scope: 'title' | 'url' | 'all';
}

// Chrome扩展特定类型扩展
declare global {
    interface Window {
        // 开发模式标识
        __DEV__: boolean;
    }
}

// Chrome Storage 事件类型
export interface StorageChangeEvent {
    // 变更的键名
    key: string;
    // 新值
    newValue: any;
    // 旧值
    oldValue: any;
}

// 异步操作状态类型
export type AsyncState<T> = {
    // 数据
    data: T | null;
    // 加载状态
    loading: boolean;
    // 错误信息
    error: string | null;
};

// ============================================================
// Space 类型（使用后端 API 类型定义）
// ============================================================
// 从 API types 导入并重导出 SpaceDto 作为主要类型
export type { SpaceDto as Space } from '@/api/types';

// 通用存储引擎接口（支持未来扩展到后端API）
export interface StorageEngine {
    // 保存单个键值对到存储
    save<T>(key: string, data: T): Promise<void>;

    // 从存储加载单个键的数据
    load<T>(key: string): Promise<T | null>;

    // 从存储删除指定键的数据
    remove(key: string): Promise<void>;

    // 清空所有存储数据
    clear(): Promise<void>;

    // 批量保存多个键值对到存储
    saveBulk(items: Record<string, any>): Promise<void>;

    // 批量从存储加载多个键的数据
    loadBulk(keys: string[]): Promise<Record<string, any>>;

    // 获取所有存储数据（性能优化版本）
    getAllData(): Promise<Record<string, any>>;
}

// Favicon 缓存数据结构（简化设计：直接存储完整DataURL）
export interface FaviconCache {
    // 完整的DataURL字符串（包含data:mime;base64,前缀）
    dataUrl: string;
    // 缓存创建时间戳
    timestamp: number;
    // 成功加载的图标源（用于调试和统计）
    source: 'saved' | 'icon.horse' | 'google' | 'fallback';
    // 数据大小（字节数，用于LRU容量管理）
    byteSize: number;
    // 可选：缓存过期时间戳
    expires?: number;
}

// LRU缓存管理配置
export interface FaviconLRUConfig {
    // 最大缓存条目数
    maxEntries: number;
    // 最大总字节数（约8MB，预留chrome.storage配额）
    maxTotalBytes: number;
    // 清理触发阈值（达到90%时开始清理）
    cleanupThreshold: number;
}

// Favicon消息通信协议
export interface FaviconMessage {
    // 请求抓取favicon
    type: 'FETCH_FAVICON';
    data: {
        url: string;
        savedFavicon?: string;
    };
}

export interface FaviconResponse {
    success: boolean;
    result?: {
        // 返回dataURL给前端使用
        dataUrl: string;
        source: FaviconCache['source'];
    };
    error?: string;
}
